package com.iris.thread.deadLock;

/**
 * 项目: thinking
 * 包名: com.iris.thread.deadLock
 * 作者: victor
 * 日期: 2016年10月31日
 * 说明: DeadLockTest
 * 大部分代码并不容易产生死锁，死锁可能在代码中隐藏相当长的时间，等待不常见的条件地发生，但即使是很小的概率，一旦发生，便可能造成毁灭性的破坏。
 * 避免死锁是一件困难的事，遵循以下原则有助于规避死锁： 
     1、只在必要的最短时间内持有锁，考虑使用同步语句块代替整个同步方法；
     2、尽量编写不在同一时刻需要持有多个锁的代码，如果不可避免，则确保线程持有第二个锁的时间尽量短暂；
     3、创建和使用一个大锁来代替若干小锁，并把这个锁用于互斥，而不是用作单个对象的对象级别锁；
 */
public class DeadLockTest {
	
	public static void main(String[] args) {
		DeadLock vr1 = new DeadLock();
		Thread th1=new Thread(vr1,"vr1");
		DeadLock vr2 = new DeadLock();
		Thread th2=new Thread(vr2,"vr2");
		vr1.setDeadlock(vr2);
		vr2.setDeadlock(vr1);
		System.out.println("Main====begin");
		th1.start();
		th2.start();
		try {
			Thread.sleep(1000);

			System.out.println("th1=vr1===interrupt");
			//中断也不会释放锁
			th1.interrupt();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}


class DeadLock implements Runnable {
	public DeadLock deadlock;
	
	public DeadLock getDeadlock() {
		return deadlock;
	}

	public void setDeadlock(DeadLock deadlock) {
		this.deadlock = deadlock;
	}

	public void run() {
		System.out.println(Thread.currentThread().getName()+"========run===begin");
		lock();
		System.out.println(Thread.currentThread().getName()+"========run===end");
	}
	
	public synchronized void lock(){
		try {
			System.out.println(Thread.currentThread().getName()+"========lock");
			deadlock.lock();
			Thread.sleep(5000);
			System.out.println(Thread.currentThread().getName()+"========lock===end");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}